//
//  IMJSONUtils.h
//  DualMediationSDK
//
//  Created by YeJary on 2025/6/23.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
 * JSON处理工具类
 * 提供JSON与对象之间的转换功能
 */
@interface IMJSONUtils : NSObject

/**
 * 将对象转换为JSON字符串
 * @param object 待转换的对象（可以是NSDictionary、NSArray等）
 * @return JSON字符串，转换失败返回nil
 */
+ (nullable NSString *)jsonStringFromObject:(id)object;

/**
 * 将JSON字符串转换为对象
 * @param jsonString JSON字符串
 * @return 转换后的对象，失败返回nil
 */
+ (nullable id)objectFromJSONString:(NSString *)jsonString;

/**
 * 将对象转换为JSON数据
 * @param object 待转换的对象
 * @return JSON数据，转换失败返回nil
 */
+ (nullable NSData *)jsonDataFromObject:(id)object;

/**
 * 将JSON数据转换为对象
 * @param jsonData JSON数据
 * @return 转换后的对象，失败返回nil
 */
+ (nullable id)objectFromJSONData:(NSData *)jsonData;

/**
 * 验证字符串是否为有效的JSON格式
 * @param jsonString 待验证的字符串
 * @return YES表示有效，NO表示无效
 */
+ (BOOL)isValidJSONString:(NSString *)jsonString;

/**
 * 美化JSON字符串（格式化输出）
 * @param jsonString 原始JSON字符串
 * @return 格式化后的JSON字符串
 */
+ (nullable NSString *)prettyJSONString:(NSString *)jsonString;

/**
 * 从字典中安全获取字符串值
 * @param dictionary 字典对象
 * @param key 键名
 * @return 字符串值，如果不存在或类型不匹配返回nil
 */
+ (nullable NSString *)safeStringFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key;

/**
 * 从字典中安全获取数字值
 * @param dictionary 字典对象
 * @param key 键名
 * @return 数字值，如果不存在或类型不匹配返回nil
 */
+ (nullable NSNumber *)safeNumberFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key;

/**
 * 从字典中安全获取数字值（带默认值）
 * @param dictionary 字典对象
 * @param key 键名
 * @param defaultValue 默认值
 * @return 数字值，如果不存在或类型不匹配返回默认值
 */
+ (nullable NSNumber *)safeNumberFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key defaultValue:(nullable NSNumber *)defaultValue;

/**
 * 从字典中安全获取字符串值（带默认值）
 * @param dictionary 字典对象
 * @param key 键名
 * @param defaultValue 默认值
 * @return 字符串值，如果不存在或类型不匹配返回默认值
 */
+ (nullable NSString *)safeStringFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key defaultValue:(nullable NSString *)defaultValue;

/**
 * 从字典中安全获取数组值
 * @param dictionary 字典对象
 * @param key 键名
 * @return 数组值，如果不存在或类型不匹配返回nil
 */
+ (nullable NSArray *)safeArrayFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key;

/**
 * 从字典中安全获取数组值（带默认值）
 * @param dictionary 字典对象
 * @param key 键名
 * @param defaultValue 默认值
 * @return 数组值，如果不存在或类型不匹配返回默认值
 */
+ (nullable NSArray *)safeArrayFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key defaultValue:(nullable NSArray *)defaultValue;

/**
 * 从字典中安全获取字典值
 * @param dictionary 字典对象
 * @param key 键名
 * @return 字典值，如果不存在或类型不匹配返回nil
 */
+ (nullable NSDictionary *)safeDictionaryFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key;

/**
 * 从字典中安全获取字典值（带默认值）
 * @param dictionary 字典对象
 * @param key 键名
 * @param defaultValue 默认值
 * @return 字典值，如果不存在或类型不匹配返回默认值
 */
+ (nullable NSDictionary *)safeDictionaryFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key defaultValue:(nullable NSDictionary *)defaultValue;

/**
 * 从字典中安全获取布尔值
 * @param dictionary 字典对象
 * @param key 键名
 * @return 布尔值，如果不存在或类型不匹配返回NO
 */
+ (BOOL)safeBoolFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key;

/**
 * 从字典中安全获取布尔值（带默认值）
 * @param dictionary 字典对象
 * @param key 键名
 * @param defaultValue 默认值
 * @return 布尔值，如果不存在或类型不匹配返回默认值
 */
+ (BOOL)safeBoolFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key defaultValue:(BOOL)defaultValue;

/**
 * 从字典中安全获取整数值
 * @param dictionary 字典对象
 * @param key 键名
 * @return 整数值，如果不存在或类型不匹配返回0
 */
+ (NSInteger)safeIntegerFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key;

/**
 * 从字典中安全获取整数值（带默认值）
 * @param dictionary 字典对象
 * @param key 键名
 * @param defaultValue 默认值
 * @return 整数值，如果不存在或类型不匹配返回默认值
 */
+ (NSInteger)safeIntegerFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key defaultValue:(NSInteger)defaultValue;

/**
 * 从字典中安全获取双精度浮点数值
 * @param dictionary 字典对象
 * @param key 键名
 * @return 双精度浮点数值，如果不存在或类型不匹配返回0.0
 */
+ (double)safeDoubleFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key;

/**
 * 从字典中安全获取双精度浮点数值（带默认值）
 * @param dictionary 字典对象
 * @param key 键名
 * @param defaultValue 默认值
 * @return 双精度浮点数值，如果不存在或类型不匹配返回默认值
 */
+ (double)safeDoubleFromDictionary:(NSDictionary *)dictionary forKey:(NSString *)key defaultValue:(double)defaultValue;

@end

NS_ASSUME_NONNULL_END